Частина 4. Адміністратор даних
— Частина 1. Вступ
           — Частина 2. Загальна структура
           — Частина 3. Первинні ланцюжки
           — Частина 4. Адміністратор даних
           — Частина 5. Адміністратор процесів
           — Частина 6. Структура додатка
           — Частина 7. Публікація в GCP
У цій статті я розповім, як написати просту адмінку для KVS на NITRO і N2O на 5 рядків!.
Постановка задачі
Сторінки
KVS.Index

  def event(:init)
  def event(:writers)
  def event({:link,id})
  def event(:user)
  def event(:session)
  def event(:enode))
    Червоним кольором виділено ідентифікатори DOM елементів, які замінюються на пререндеровані на сервері шматки HTML сніпетів. Як це відбувається в Live View і навіть PHP! Але на відміну від використання Suck and Blow нотації для темплейт енжинів, таких як ASP, PHP, EEX, DTL та інших, NITRO пропонує вбудовування в хост мову або глибоке вбудовування HTML5 Erlang в даному випадку і є фреймворком, який перебуває у своєму класі: OCaml Ocsigen, Scala Lift, SML UrWeb, F# WebSharper, Erlang Nitrogen. Основна ідея - пишемо все однією мовою і навчати новачків треба одній мові причому одночасно показуючи як писати на ньому веб-додатки, які і так всі розуміють як писати.
priv/static/kvs.htm
<nav>
  <a href='login.htm'>LOGIN</a>
  <a href='plm.htm'>PLM</a>
  <a href='bpe.htm'>BPE</a>
  <a href='form.htm'>FORM</a>
  <a href='kvs.htm'>KVS</a>
</nav>
<aside>
  <article>
    <section>
      <h2>KVS</h2>
      <p>Abstract chain database</p>
      <div>USER: <span id=user></span>
            SSD: <span id=disc></span>
            RAM: <span id=ram></span><br>
        SESSION: <span id=session></span>
             VM: <span id=enode></span></div>
    </section>
    <div class=container>
      <div><h2>WRITERS</h2>
      <div id=writers></div></div>
      <div><h2>CHAINS</h2>
      <div id=feeds>To display the chain
              select the writer.</div></div>
    </div>
  </article>
</aside>
    lib/events/kvs.ex
defmodule KVS.Index do
  use N2O, with: [:n2o, :nitro]
  use FORM
  use KVS
  require ERP
  require Logger
  def parse(ERP."Employee"(person:
            ERP."Person"(cn: name))),
  do: name
  def parse(_), do: []
  def event(:init),
    do:
      [:user, :writers, :session, :enode]
      |> Enum.map(fn x ->
       [ NITRO.clear(x),
         send(self(), {:direct, x})] end)
  def event(:user),
  do: NITRO.update(:user,
      span(body: parse(:n2o.user())))
  def event(:session),
  do: NITRO.update(:session,
      span(body: :n2o.sid()))
  def event(:enode),
  do: NITRO.update(:enode,
      span(body: NITRO.compact(:erlang.node())))
  def event({:link, i}),
  do: [
      NITRO.clear(:feeds),
      :kvs.feed(i) |> Enum.map(fn t ->
        NITRO.insert_bottom(:feeds,
          panel(body: NITRO.compact(t))) end)
    ]
  def event(:writers),
    do:
      :writer
      |> :kvs.all()
      |> :lists.sort()
      |> Enum.map(fn writer(id: i, count: c) ->
        NITRO.insert_bottom(
          :writers,
          panel(body:
          [link(body: i, postback: {:link, i}),
           ' (' ++ NITRO.to_list(c) ++ ')']))
      end)
  def event(_), do: []
  def ram(os), do: NITRO.compact(os)
end
    Роутер
kvs — KVS.Index
    
Код програми можна знайти в наступних репозиторіях: